#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#define RIGHT 1
#define DOWN 2
#define LEFT 3
#define UP 4
//int main()
//{
//	int a[20][20]={0};
//	int n, m = 1;
//	int x, y;
//	int direct = RIGHT;
//	scanf("%d", &n);
//	for (x = 0; x < n + 1; x++)
//	{
//		a[x][0] = -1;
//		a[x][n + 1] = -1;
//		a[0][x] = -1;
//		a[n + 1][x] = -1;
//	}
//	x = 1;
//	y = 1;
//	while (m <= n * n)
//	{
//		a[x][y] = m++;
//		switch (direct)
//		{
//		case RIGHT:
//			if (a[x][y + 1] != 0)
//			{
//				direct = DOWN;
//				x++;
//			}
//			else
//				y++;
//			break;
//		case LEFT:
//			if (a[x][y - 1] != 0)
//			{
//				direct = UP;
//				x--;
//			}
//			else
//				y--;
//			break;
//		case UP:
//			if (a[x - 1][y] != 0)
//			{
//				direct = RIGHT;
//				y++;
//			}
//			else
//				x--;
//			break;
//		case DOWN:
//			if (a[x + 1][y] != 0)
//			{
//				direct = LEFT;
//				y--;
//			}
//			else
//				x++;
//			break;
//		}
//	}
//	int i = 0, j = 0;
//	for (i = 1; i <= n; i++)
//	{
//		for (j = 1; j <= n; j++)
//		{
//			printf("%-2d ", a[i][j]);
//		}
//		printf("\n");
//	}
//	return 0;
//}

int main()
{
	int a[20][20] = { 0 };
	int n, m = 1;
	int x, y;
	int direct = RIGHT;
	scanf("%d", &n);
	for (x = 0; x < n + 1; x++)
	{
		a[x][0] = -1;
		a[x][n + 1] = -1;
		a[0][x] = -1;
		a[n + 1][x] = -1;
	}
	x = 1;
	y = 1;
	while (m <= n * n)
	{
		a[x][y] = m++;
		switch (direct)
		{
		case RIGHT:
			if (a[x][y + 1] != 0)
			{
				direct = DOWN;
				x++;
			}
			else
				y++;
			break;
		case LEFT:
			if (a[x][y - 1] != 0)
			{
				direct = UP;
				x--;
			}
			else
				y--;
			break;
		case UP:
			if (a[x - 1][y] != 0)
			{
				direct = RIGHT;
				y++;
			}
			else
				x--;
			break;
		case DOWN:
			if (a[x + 1][y] != 0)
			{
				direct = LEFT;
				y--;
			}
			else
				x++;
			break;
		}
	}
	int i = 0, j = 0;
	for (i = 1; i <= n; i++)
	{
		for (j = 1; j <= n; j++)
		{
			printf("%-2d ", a[i][j]);
		}
		printf("\n");
	}
	return 0;
}